package com.song.user.controller;

import com.song.api.BaseController;
import com.song.api.controller.user.PassportControllerApi;
import com.song.enums.UserStatus;
import com.song.grace.result.GraceJSONResult;
import com.song.grace.result.ResponseStatusEnum;
import com.song.pojo.AppUser;
import com.song.pojo.bo.RegisterLoginBO;
import com.song.user.service.UserService;
import com.song.utils.IPUtil;
import com.song.utils.JsonUtils;
import com.song.utils.RegexUtils;
import com.song.utils.SMSUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.UUID;

@RestController
public class PassportController extends BaseController implements PassportControllerApi {

    private static final Logger LOG = LoggerFactory.getLogger(PassportController.class);

    @Autowired
    private SMSUtils smsUtils;

    @Autowired
    private UserService userService;

    @Override
    public GraceJSONResult getSMSCode(String mobile, HttpServletRequest request) {

        // 验证手机号码是否正确
        if (!RegexUtils.checkMobile(mobile)){
            return GraceJSONResult.errorCustom(ResponseStatusEnum.USER_MOBILE_ERROR);
        }
        // 根据用户的ip来限制用户在60秒内只能获得一次验证吗。
        String userIP = IPUtil.getRequestIp(request);

        // value随意填写即可，因为仅仅只是用来锁住ip的，60秒过后，又能发送了
        // 也就是说，这个key存在，则当前ip用户无法发送验证码，直到key消失
        redis.setnx60s(MOBILE_SMSCODE + userIP, userIP);


//        if (mobile.equalsIgnoreCase("123456")) {
//            mobile = MyInfo.getMobile();
//        }
        //获取六位数的验证码
        String random = (int) ((Math.random() * 9 + 1) * 100000) + "";
        //        smsUtils.sendSMS(mobile, random);
        System.out.println(random);
        // 把验证码放入redis，用于后续进行验证
        redis.set(MOBILE_SMSCODE + mobile, random, 30 * 60);

        return GraceJSONResult.ok();
    }

    @Override
    public GraceJSONResult doLogin(RegisterLoginBO registerLoginBO,
                                   HttpServletRequest request,
                                   HttpServletResponse response) {

        // 获得前端传来的基本信息
        String smsCode = registerLoginBO.getSmsCode();
        String mobile = registerLoginBO.getMobile();

        // 0. 校验验证码是否匹配
        String redisSMSCode = redis.get(MOBILE_SMSCODE + mobile);
        if (StringUtils.isBlank(redisSMSCode) || !redisSMSCode.equalsIgnoreCase(smsCode)) {
            return GraceJSONResult.errorCustom(ResponseStatusEnum.SMS_CODE_ERROR);
        }

        // 1. 查询数据库，该用户是否注册过
        AppUser user = userService.queryMobileIsExist(mobile);
        if (user != null && user.getActiveStatus().equals(UserStatus.FROZEN.type)) {
            // 2. 如果用户不为空并且状态已经冻结，则直接抛出异常，无法登录
            return GraceJSONResult.errorCustom(ResponseStatusEnum.USER_FROZEN);
        } else if (user == null) {
            // 3. 如果没有注册过，注册用户信息入库，用户状态未激活
            user = userService.createUser(mobile);
        }

        // 3.保存用户分布式会话的相关操作
        int userActiveStatus = user.getActiveStatus();
        if (userActiveStatus != UserStatus.FROZEN.type) {
            // 4.保存token到redis
            String utoken = UUID.randomUUID().toString();
            redis.set(REDIS_USER_TOKEN + user.getId(), utoken);
            redis.set(REDIS_USER_INFO + user.getId(), JsonUtils.objectToJson(user));
            // 5.保存用户id和token到cookie中
            setCookie(request, response, "utoken", utoken, COOKIE_MONTH);
            setCookie(request, response, "uid", user.getId(), COOKIE_MONTH);
        }

        // 6.登录用户成功则需要删除已经使用过的验证码，该验证码只能使用一次，用过后作废
        redis.del(MOBILE_SMSCODE + mobile);

        // 7.用户状态：未激活或者已激活，返回给前端，用于页面跳转
        return GraceJSONResult.ok(userActiveStatus);
    }

    @Override
    public GraceJSONResult logout(HttpServletRequest request, HttpServletResponse response, String userId) {


        // 1. 清除用户已登录的会话信息
        redis.del(REDIS_USER_TOKEN + userId);

        // 2. 清除用户userId与token的cookie
        deleteCookie(request,response,"utoken");
        deleteCookie(request, response, "uid");

        return GraceJSONResult.ok();
    }

}
